package com.smart.community.feign.region.fallback;

import java.util.Collections;
import java.util.List;

import org.springframework.stereotype.Component;

import com.smart.community.feign.common.BaseFeignFallbackFactory;
import com.smart.community.feign.region.dto.HouseholdInfoDTO;
import com.smart.community.feign.region.dto.BuildingInfoDTO;
import com.smart.community.feign.region.dto.UnitInfoDTO;
import com.smart.community.feign.region.dto.CommunityInfoDTO;
import com.smart.community.feign.region.service.RegionDataFeignService;

import lombok.extern.slf4j.Slf4j;

/**
 * 区域数据服务Feign接口降级处理工厂
 * 
 * 当区域数据服务不可用时，提供降级处理：
 * 1. 返回安全的默认值，避免调用方异常
 * 2. 记录详细的错误日志，便于问题排查
 * 3. 确保系统稳定性，避免级联故障
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 * @updated 2025-08-28 - 继承BaseFeignFallbackFactory，使用统一的降级处理标准
 */
@Slf4j
@Component
public class RegionDataFeignFallbackFactory extends BaseFeignFallbackFactory<RegionDataFeignService> {
    
    @Override
    public RegionDataFeignService create(Throwable cause) {
        // 使用基类的统一日志记录方法，区分异常类型
        if (isServiceUnavailable(cause)) {
            logServiceUnavailable(getServiceName(), cause);
        } else {
            log.warn("{}服务调用异常，执行降级处理: {}", getServiceName(), cause.getMessage());
        }
        
        return new RegionDataFeignService() {
            
            @Override
            public HouseholdInfoDTO getHouseholdById(Long householdId) {
                logMethodFallback("getHouseholdById", householdId);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public BuildingInfoDTO getBuildingById(Long buildingId) {
                logMethodFallback("getBuildingById", buildingId);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public UnitInfoDTO getUnitById(Long unitId) {
                logMethodFallback("getUnitById", unitId);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public CommunityInfoDTO getCommunityById(Long communityId) {
                logMethodFallback("getCommunityById", communityId);
                return null; // 返回null，表示未找到
            }
            
            @Override
            public List<HouseholdInfoDTO> getHouseholdsByIds(List<Long> householdIds) {
                logMethodFallback("getHouseholdsByIds", householdIds);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<BuildingInfoDTO> getBuildingsByIds(List<Long> buildingIds) {
                logMethodFallback("getBuildingsByIds", buildingIds);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<UnitInfoDTO> getUnitsByIds(List<Long> unitIds) {
                logMethodFallback("getUnitsByIds", unitIds);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
            
            @Override
            public List<CommunityInfoDTO> getCommunitiesByIds(List<Long> communityIds) {
                logMethodFallback("getCommunitiesByIds", communityIds);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }

            @Override
            public List<Long> getHouseholdIdsByCommunityIds(List<Long> communityIds) {
                logMethodFallback("getHouseholdIdsByCommunityIds", communityIds);
                return Collections.emptyList(); // 返回空列表，不影响业务
            }
        };
    }
    
    @Override
    protected String getServiceName() {
        return "区域数据服务";
    }
} 